/**
 * 
 */
package com.jiang.dao;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import com.jiang.utils.DBConnectionUtils;

/**
 * @author Administrator
 * @抽象DAO类，实现一些公共的功能，子类继承后能具备一些通用的功能，再去实现各自接口 
 * 把数据库的连接获得在这个抽象类中完成,其他的类继承他自然就有了连接
 */
public abstract class AbstractDAOImpl<K> {

	public Connection conn = null;
	public PreparedStatement ps = null;
	private String typeName = null;
	/**
	 * 抽象类也可以有构造函数, 只是不能直接new需要子类构造函数的时候，默认去掉父类的构造
	 */
	public AbstractDAOImpl() {
		this.conn = DBConnectionUtils.getConnection();
		Class<?> c = this.getClass();
		Type t = c.getGenericSuperclass();
		Type[] genericType = ((ParameterizedType) t).getActualTypeArguments();
		// K的类型就是[0]
		Type kType = genericType[0];
		String typeNameFull = kType.getTypeName();
		this.typeName = typeNameFull.substring(typeNameFull.lastIndexOf(".")+1);
	}

	/**
	 * 实现数据的批量删除，这个时候的批量删除属于彻底删除功能
	 * 
	 * @param table
	 *            表名称
	 * @param column
	 *            删除表的列名称
	 * @param ids
	 *            所有的id数据，使用Set集合可以避免重复
	 * @return 如果删除成功返回true，否则返回false
	 * @throws SQLException
	 */
	public Boolean removeHandle(String table, String column, Set<K> ids) throws SQLException {
		
		StringBuffer sb = new StringBuffer();
		if(ids!=null && ids.size()>0){
			Iterator<K> iterator = ids.iterator();
			// 这里的设置就限定了只能使用Integer不能使用String, 为了兼容我们做个判断
			sb.append("DELETE FROM " + table +" WHERE " + column + "in (");
			switch(this.typeName){
			
					case "int":
					case "Integer":
						while(iterator.hasNext()){
							sb.append(iterator.next()+",");
						}
						// 删除最后的逗号
						sb.delete(sb.length()-1, sb.length());
						sb.append(") "); // 程序中写SQL是无分号结尾的
						break;
					case "String":
						while(iterator.hasNext()){
							sb.append("'"+iterator.next()+"'"+",");
						}
						// 删除最后的逗号
						sb.delete(sb.length()-1, sb.length());
						sb.append(") "); // 程序中写SQL是无分号结尾的
						break;
			}
		}
		String sql = sb.toString();
		this.ps = this.conn.prepareStatement(sql);
		return this.ps.executeUpdate() == ids.size();
	}
	
	
	/**
	 * 负责统计出数据量
	 * 
	 * @param table
	 *            要统计数据的表名称
	 * @param column
	 *            模糊查询的数据列
	 * @param keyWord
	 *            模糊查询关键字
	 * @return 返回指定表的数据量，如果表没有数据，返回0
	 * @throws SQLException
	 */
	public Integer countHandle(String table, String column, String keyWord) throws SQLException {
		
		String sql = "SELECT COUNT(1) FROM " + table + " WHERE " + column  + "LIKE ? ";
		this.ps = this.conn.prepareStatement(sql);
		ps.setString(1, "%"+keyWord+"%");
		ResultSet rs = ps.executeQuery();
		if(rs.next()){
			return rs.getInt(1);
		}
		return 0;
	}

	/**
	 * 负责查询出指定id范围内不为空的图片地址
	 * @param table
	 * @param photoColumn
	 * @param column
	 * @param ids
	 * @return
	 * @throws SQLException
	 */
	public Set<String> photoHandle(String table, String photoColumn, String column, Set<K> ids) throws SQLException {
		
		Set<String> photos = new HashSet<>();
		if(ids!=null && ids.size()>0){
			
			StringBuffer sb = new StringBuffer();
			sb.append("SELECT ").append(photoColumn).append(" FROM ").append(table).append(" WHERE ").append(column).append(" IN(");
			for(int i=0;i<ids.size();i++){
				sb.append("?,");
			}
			// 删除最后的逗号
			sb.delete(sb.length()-1, sb.length());
			sb.append(") AND ").append(photoColumn).append("<>'nophoto.jpg'");
			this.ps = this.conn.prepareStatement(sb.toString());
			int count = 1; // 循环计数器
			Iterator<K> iterator = ids.iterator();
			// 根据不同的类型来进行数据赋值
			if("int".equalsIgnoreCase(this.typeName) || "Integer".equalsIgnoreCase(this.typeName)){
				while(iterator.hasNext()){
					this.ps.setInt(count, (int)iterator.next());
					count++;
				}
			}else if("String".equalsIgnoreCase(this.typeName)){
				while(iterator.hasNext()){
					this.ps.setString(count, iterator.next().toString());
					count++;
				}
			}
			count  = 0; // 重置
			ResultSet rs = this.ps.executeQuery();
			while(rs.next()){
				photos.add(rs.getString(1));
			}
		}
		return photos;
	}

}
